package com.zlsy.thread.joinlearing;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;

/**
 * @author zhouliang
 * @date 2020/3/7 18:16
 */
@Slf4j
public class JoinInterrupt {

    //join遇到中断的情况：子线程去中断主线程，主线程收到中断的信号，主线程抛异常停止，然后通知子线程也停止


    public static void main(String[] args) {
        //主线程对象
        Thread mainThread = Thread.currentThread();
        //子线程
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                mainThread.interrupt();
                try {
                    //子线程sleep过程可以收到主线程的中断信号
                    TimeUnit.SECONDS.sleep(5);
                } catch (InterruptedException e) {
                    log.error("子线程收到主线程传来的中断信息，并且自己马上进行中断操作。");
                    throw new RuntimeException(e);

                }
               log.error("子线程并没有被中断！");
            }
        });
        //启动子线程
        thread.start();
        try {
            //主线程等待子线程执行完毕，由于子线程发出了中断主线程的信号
            thread.join();
        } catch (InterruptedException e) {
            //如果想要停止子线程，那么还应当通知子线程停止执行
            thread.interrupt();
            //主线程会抛出异常停止执行
            log.error("主线程收到中断信息，并且进行中断操作。");
            throw new RuntimeException(e);
        }
        log.error("主线程并没有被中断。。。。。。。");
    }
}
